/**
 * API适配器
 * 根据配置自动切换使用真实API或Mock数据
 * 提供统一的接口，让业务代码不需要关心数据来源
 */

import { API_CONFIG } from '../config.js';

/**
 * API适配器类
 * 封装Mock数据和真实API的切换逻辑
 */
export class ApiAdapter {
    /**
     * 构造函数
     * @param {object} options - 配置选项
     * @param {boolean} options.useMock - 是否使用Mock数据
     * @param {number} options.mockDelay - Mock数据延迟时间（毫秒）
     * @param {object} options.mockService - Mock服务类
     * @param {object} options.realService - 真实API服务类
     */
    constructor(options) {
        const {
            useMock = false,
            mockDelay = 300,
            mockService = null,
            realService = null
        } = options;

        // 配置参数
        this.useMock = useMock;
        this.mockDelay = mockDelay;
        this.mockService = mockService;
        this.realService = realService;
    }

    /**
     * 模拟网络延迟
     * 让Mock数据返回更真实，模拟网络请求的延迟
     * @param {number} delay - 延迟时间（毫秒）
     * @returns {Promise} Promise对象
     */
    async simulateDelay(delay = this.mockDelay) {
        return new Promise(resolve => setTimeout(resolve, delay));
    }

    /**
     * 执行请求
     * 根据配置决定使用Mock数据还是真实API
     * Mock 服务和真实 API Service 层返回的数据格式完全一致，无需额外包装
     * @param {string} method - 服务方法名
     * @param {Array} args - 方法参数
     * @returns {Promise} 响应数据
     */
    async execute(method, ...args) {
        if (this.useMock && this.mockService) {
            // 使用Mock数据
            console.log(`[Mock] 调用: ${method}`, args);

            // 模拟网络延迟
            await this.simulateDelay();

            // 调用Mock服务方法，直接返回数据（格式与真实 API Service 一致）
            return await this.mockService[method](...args);
        } else if (this.realService) {
            // 使用真实API
            console.log(`[API] 调用: ${method}`, args);
            return this.realService[method](...args);
        } else {
            throw new Error('未配置Mock服务或真实API服务');
        }
    }

    /**
     * GET请求适配器
     * @param {string} method - 方法名
     * @param {object} params - 查询参数
     * @returns {Promise} 响应数据
     */
    async get(method, params = {}) {
        return this.execute(method, params);
    }

    /**
     * POST请求适配器
     * @param {string} method - 方法名
     * @param {object} data - 请求数据
     * @returns {Promise} 响应数据
     */
    async post(method, data) {
        return this.execute(method, data);
    }

    /**
     * PUT请求适配器
     * @param {string} method - 方法名
     * @param {number|string} id - 资源ID
     * @param {object} data - 更新数据
     * @returns {Promise} 响应数据
     */
    async put(method, id, data) {
        return this.execute(method, id, data);
    }

    /**
     * DELETE请求适配器
     * @param {string} method - 方法名
     * @param {number|string} id - 资源ID
     * @returns {Promise} 响应数据
     */
    async delete(method, id) {
        return this.execute(method, id);
    }
}

/**
 * 创建API适配器实例的工厂函数
 * @param {object} config - 配置对象
 * @param {boolean} config.useMock - 是否使用Mock数据
 * @param {number} config.mockDelay - Mock延迟时间
 * @param {object} config.mockService - Mock服务类
 * @param {object} config.realService - 真实API服务类
 * @returns {ApiAdapter} 适配器实例
 */
export function createApiAdapter(config) {
    return new ApiAdapter(config);
}

/**
 * 根据模块配置创建适配器
 * 自动从API_CONFIG中读取配置
 * @param {string} moduleName - 模块名称（如'DOCUMENTATION'、'HTML_CODE_MANAGEMENT'）
 * @param {object} mockService - Mock服务类
 * @param {object} realService - 真实API服务类
 * @returns {ApiAdapter} 适配器实例
 */
export function createModuleAdapter(moduleName, mockService, realService) {
    const moduleConfig = API_CONFIG[moduleName] || {};

    return new ApiAdapter({
        useMock: moduleConfig.USE_MOCK_DATA ?? API_CONFIG.USE_MOCK_DATA,
        mockDelay: moduleConfig.MOCK_DELAY ?? 300,
        mockService,
        realService
    });
}

